﻿
using System;
using System.Data.SqlClient;
using System.Globalization;
using System.Runtime.Serialization;
using ProtoBuf;/*https://github.com/ServiceStack/ServiceStack/tree/master/lib*/
using ServiceStack.Text;/*https://github.com/ServiceStack/ServiceStack.Text*/
using V82;
using V82.ОбщиеОбъекты;
using V82.СправочникиСсылка;
using V82.СправочникиОбъект;
using V82.ДокументыСсылка;
using V82.Перечисления;//Ссылка;
namespace V82.СправочникиОбъект
{
	///<summary>
	///(Общ)
	///</summary>
	[ProtoContract]
	[DataContract]
	public partial class БанковскиеСчета:СправочникОбъект
	{
		public bool _ЭтоНовый;
		public bool ЭтоНовый()
		{
			return _ЭтоНовый;
		}
		[DataMember]
		[ProtoMember(1)]
		public Guid Ссылка {get;set;}
		[DataMember]
		[ProtoMember(2)]
		public long Версия {get;set;}
		[DataMember]
		[ProtoMember(3)]
		public string ВерсияДанных {get;set;}
		/*static хэш сумма состава и порядка реквизитов*/
		/*версия класса восстановленного из пакета*/
		[DataMember]
		[ProtoMember(4)]
		public bool ПометкаУдаления {get;set;}
		[DataMember]
		[ProtoMember(5)]
		public bool Предопределенный {get;set;}
		[DataMember]
		[ProtoMember(6)]
		public Guid Владелец {get;set;}
		[DataMember]
		[ProtoMember(7)]
		public string/*9*/ Код {get;set;}
		[DataMember]
		[ProtoMember(8)]
		public string/*100*/ Наименование {get;set;}
		///<summary>
		///(Общ) Номер расчетного счета
		///</summary>
		[DataMember]
		[ProtoMember(9)]
		public string/*(20)*/ НомерСчета {get;set;}//Номер счета
		///<summary>
		///(Общ)
		///</summary>
		[DataMember]
		[ProtoMember(10)]
		public V82.СправочникиСсылка.Банки Банк {get;set;}
		///<summary>
		///(Регл) Банк, в случае непрямых расчетов
		///</summary>
		[DataMember]
		[ProtoMember(11)]
		public V82.СправочникиСсылка.Банки БанкДляРасчетов {get;set;}//Банк для расчетов
		///<summary>
		///(Регл) Текст "Плательщик\Получатель" в платежных документах
		///</summary>
		[DataMember]
		[ProtoMember(12)]
		public string/*(0)*/ ТекстКорреспондента {get;set;}//Текст корреспондента
		///<summary>
		///(Общ) Текст назначения платежа
		///</summary>
		[DataMember]
		[ProtoMember(13)]
		public string/*(0)*/ ТекстНазначения {get;set;}//Текст назначения
		///<summary>
		///(Общ) Расчетный, депозитный, ссудный, иной
		///</summary>
		[DataMember]
		[ProtoMember(14)]
		public string/*(15)*/ ВидСчета {get;set;}//Вид счета
		///<summary>
		///(Общ) Валюта, в которой хранятся денежные средства
		///</summary>
		[DataMember]
		[ProtoMember(15)]
		public V82.СправочникиСсылка.Валюты ВалютаДенежныхСредств {get;set;}//Валюта денежных средств
		///<summary>
		///(Регл) Номер и дата разрешения открытия счета
		///</summary>
		[DataMember]
		[ProtoMember(16)]
		public string/*(30)*/ НомерИДатаРазрешения {get;set;}//Номер и дата разрешения
		///<summary>
		///(Общ) Дата открытия счета
		///</summary>
		[DataMember]
		[ProtoMember(17)]
		public DateTime ДатаОткрытия {get;set;}//Дата открытия
		///<summary>
		///(Общ) Дата закрытия счета
		///</summary>
		[DataMember]
		[ProtoMember(18)]
		public DateTime ДатаЗакрытия {get;set;}//Дата закрытия
		///<summary>
		///(Общ) Указывать в дате документа месяц прописью
		///</summary>
		[DataMember]
		[ProtoMember(19)]
		public bool МесяцПрописью {get;set;}//Месяц прописью
		///<summary>
		///(Общ) Указывать сумму без копеек, если она в целых рублях
		///</summary>
		[DataMember]
		[ProtoMember(20)]
		public bool СуммаБезКопеек {get;set;}//Сумма без копеек
		public void Записать()
		{
			//Установка блокировки элемента на горизантально масштабированный кластер.
			//Опционально введение тайм аута на запись одного и того же объекта, не чаще раза в 5-секунд. Защита от спама. упращение алгоритма блокировки.
			//Выделение сервиса для блокировки элемента и генерации кода
			//Выполнение операций контроля без обращений к sql-серверу.
			//Контроль конфликта блокировок.
			//Контроль загрузки булкинсертом гетерогенной коллекции.
			//Контроль уникальности кода для справочников.
			//Контроль уникальности номера для документов, в границах префикса.
			//Контроль владельца, он не может быть группой.
			//Контроль владельца он должен быть задан.
			//Контроль родителя он должен быть группой.
			//Контроль количества уровней, должен соотвествовать метаданным.
			//Контроль версии, объект не должен был быть записан перед чтением текущей записи, алгоритм версионника.
			//Контроль уникальности ссылки
			//Контроль зацикливания
			//Опционально контроль битых ссылок.
			//Соблюдейние транзакционности. ПередЗаписью. Открытие транзации. Валидации. ПриЗаписи. Фиксация транзакции. Информирование о записи элемента.
			using (var Подключение = new SqlConnection(СтрокаСоединения))
			{
				Подключение.Open();
				using (var Команда = Подключение.CreateCommand())
				{
					if(_ЭтоНовый)
					{
						Команда.CommandText = @"
						Insert Into _Reference7(
						_IDRRef
						/*,_Version*/
						,_Marked
						,_IsMetadata
						,_OwnerID_TYPE,_OwnerID_RTRef,_OwnerID_RRRef
						,_Code
						,_Description
						,_Fld891
						,_Fld892RRef
						,_Fld893RRef
						,_Fld894
						,_Fld895
						,_Fld896
						,_Fld897RRef
						,_Fld898
						,_Fld899
						,_Fld900
						,_Fld901
						,_Fld902)
						Values(
						@Ссылка
						/*,@Версия*/
						,@ПометкаУдаления
						,@Предопределенный
						,@ВладелецТип,@ВладелецВид,@Владелец
						,@Код
						,@Наименование
						,@НомерСчета
						,@Банк
						,@БанкДляРасчетов
						,@ТекстКорреспондента
						,@ТекстНазначения
						,@ВидСчета
						,@ВалютаДенежныхСредств
						,@НомерИДатаРазрешения
						,@ДатаОткрытия
						,@ДатаЗакрытия
						,@МесяцПрописью
						,@СуммаБезКопеек)";
					}
					else
					{
						Команда.CommandText = @"
						Update _Reference7
						Set
						/*_IDRRef	= @Ссылка*/
						/*,_Version	= @Версия*/
						_Marked	= @ПометкаУдаления
						,_IsMetadata	= @Предопределенный
						,_OwnerID_TYPE	= @ВладелецТип,_OwnerID_RTRef	= @ВладелецВид,_OwnerID_RRRef	= @Владелец
						,_Code	= @Код
						,_Description	= @Наименование
						,_Fld891	= @НомерСчета
						,_Fld892RRef	= @Банк
						,_Fld893RRef	= @БанкДляРасчетов
						,_Fld894	= @ТекстКорреспондента
						,_Fld895	= @ТекстНазначения
						,_Fld896	= @ВидСчета
						,_Fld897RRef	= @ВалютаДенежныхСредств
						,_Fld898	= @НомерИДатаРазрешения
						,_Fld899	= @ДатаОткрытия
						,_Fld900	= @ДатаЗакрытия
						,_Fld901	= @МесяцПрописью
						,_Fld902	= @СуммаБезКопеек
						Where _IDRRef = @Ссылка";
					}
					Команда.Parameters.AddWithValue("Ссылка", Ссылка.ToByteArray());
					/*Команда.Parameters.AddWithValue("Версия", Версия);*/
					Команда.Parameters.AddWithValue("ПометкаУдаления", ПометкаУдаления);
					Команда.Parameters.AddWithValue("Предопределенный", Предопределенный);
					Команда.Parameters.AddWithValue("ВладелецТип", 0);
					Команда.Parameters.AddWithValue("ВладелецВид", 0);
					Команда.Parameters.AddWithValue("Владелец", Владелец);
					Команда.Parameters.AddWithValue("Код", Код);
					Команда.Parameters.AddWithValue("Наименование", Наименование);
					Команда.Parameters.AddWithValue("НомерСчета", НомерСчета);
					Команда.Parameters.AddWithValue("Банк", Банк.Ссылка);
					Команда.Parameters.AddWithValue("БанкДляРасчетов", БанкДляРасчетов.Ссылка);
					Команда.Parameters.AddWithValue("ТекстКорреспондента", ТекстКорреспондента);
					Команда.Parameters.AddWithValue("ТекстНазначения", ТекстНазначения);
					Команда.Parameters.AddWithValue("ВидСчета", ВидСчета);
					Команда.Parameters.AddWithValue("ВалютаДенежныхСредств", ВалютаДенежныхСредств.Ссылка);
					Команда.Parameters.AddWithValue("НомерИДатаРазрешения", НомерИДатаРазрешения);
					Команда.Parameters.AddWithValue("ДатаОткрытия", ДатаОткрытия);
					Команда.Parameters.AddWithValue("ДатаЗакрытия", ДатаЗакрытия);
					Команда.Parameters.AddWithValue("МесяцПрописью", МесяцПрописью);
					Команда.Parameters.AddWithValue("СуммаБезКопеек", СуммаБезКопеек);
					Команда.ExecuteNonQuery();
				}
			}
		}
		public void Удалить()
		{
			using (var Подключение = new SqlConnection(СтрокаСоединения))
			{
				Подключение.Open();
				using (var Команда = Подключение.CreateCommand())
				{
					Команда.CommandText = @"Delete _Reference7
					Where _IDRRef=@Ссылка";
					Команда.Parameters.AddWithValue("Ссылка", Ссылка.ToByteArray());
					Команда.ExecuteNonQuery();
				}
			}
		}
		/*МодульОбъекта*/

		public object ПроверитьКорректностьНомераСчета(/*Номер, ТекстОшибки = ""*/)
		{
			if(true/*НЕ ТипЗнч(Номер) = Тип("Строка")*/)
			{
				//ТекстОшибки = "Номер счета должен быть строкой.";
			}
			if(true/*ПустаяСтрока(Номер)*/)
			{
			}
			if(true/*НЕ ЭтоВалютныйСчет И СтрДлина(Номер) <> 20*/)
			{
				//ТекстОшибки = "Номер счета должен состоять из 20 знаков.";
			}
			if(true/*НЕ ОбщегоНазначения.ТолькоЦифрыВСтроке(Номер)*/)
			{
				//ТекстОшибки = "В номере счета есть не только цифры. Возможно, номер указан неверно.";
			}
			return null;
		}
		// ПроверитьКорректностьНомераСчета()

		public object ПроверитьКорректностьБИК(/*БИК, ТекстОшибки = ""*/)
		{
			if(true/*НЕ ТипЗнч(БИК) = Тип("Строка")*/)
			{
				//ТекстОшибки = "БИК банка должен быть строкой.";
			}
			if(true/*ПустаяСтрока(БИК)*/)
			{
			}
			if(true/*СтрДлина(БИК) <> 9*/)
			{
				//ТекстОшибки = "БИК банка должен состоять из 9 знаков.";
			}
			if(true/*НЕ ОбщегоНазначения.ТолькоЦифрыВСтроке(БИК)*/)
			{
				//ТекстОшибки = "В составе БИК банка должны быть только цифры.";
			}
			if(true/*НЕ Лев(БИК, 2) = "04"*/)
			{
				//ТекстОшибки = "Первые 2 цифры БИК банка должны быть ""04"".";
			}
			return null;
		}
		// ПроверитьКорректностьБИК()

		public object ПроверитьКорректностьКоррсчета(/*Коррсчет, ТекстОшибки = ""*/)
		{
			if(true/*НЕ ТипЗнч(Коррсчет) = Тип("Строка")*/)
			{
				//ТекстОшибки = "Корр.счет банка должен быть строкой.";
			}
			if(true/*ПустаяСтрока(Коррсчет)*/)
			{
			}
			if(true/*СтрДлина(Коррсчет) <> 20*/)
			{
				//ТекстОшибки = "Корр.счет банка должен состоять из 20 знаков.";
			}
			if(true/*НЕ ОбщегоНазначения.ТолькоЦифрыВСтроке(Коррсчет)*/)
			{
				//ТекстОшибки = "В составе корр.счета банка должны быть только цифры.";
			}
			return null;
		}
		// ПроверитьКорректностьКоррсчета()
		// Обработчик события ПередЗаписью формы.
		//

		public void ПередЗаписью(/*Отказ*/)
		{
			if(true/*ОбменДанными.Загрузка*/)
			{
			}
			if(true/*ПометкаУдаления ИЛИ Ссылка.ПометкаУдаления*/)
			{
			}
			//Заголовок = "Запись банковского счета (" + Владелец + ") " + Наименование + ", код " + Код;
			if(true/*НЕ ОбщегоНазначения.ТолькоЦифрыВСтроке(СокрЛП(НомерСчета))*/)
			{
				/*ОбщегоНазначения.СообщитьОбОшибке("В номере банковского счета присутствуют не только цифры. 
		|Возможно, номер указан неправильно", , Заголовок);*/
			}
			/*// Проверка заполнения обязательных реквизитов
*/
			if(true/*НЕ ЗначениеЗаполнено(ВалютаДенежныхСредств)*/)
			{
				//ОбщегоНазначения.СообщитьОбОшибке("Не выбрана валюта.", Отказ, Заголовок);
			}
			if(true/*ВалютаДенежныхСредств = мВалютаРегламентированногоУчета*/)
			{
				if(true/*НЕ ЗначениеЗаполнено(НомерСчета)*/)
				{
					//ОбщегоНазначения.СообщитьОбОшибке("Не указан номер счета.", Отказ, Заголовок);
				}
				if(true/*НЕ ЗначениеЗаполнено(Банк)*/)
				{
					//ОбщегоНазначения.СообщитьОбОшибке("Не выбран банк.", Отказ, Заголовок);
				}
			}
		}
	}
}